package com.smh.demo1.a09;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author shiminghui
 * @date 2025/4/12 13:59
 * @description: TODO
 */
@ComponentScan("com.smh.demo1.a09")
// SpringBootApplication注解就涵盖了ComponentScan注解
public class A09Application {
    public static void main(String[] args) {
        /**
         * 多例Bean失效的原因
         *  单例bean中依赖注入一个多例Bean,但是依赖注入只进行了一次,所以注入的Bean实例是同一个
         *  解决方法
         *  1. 使用@Lazy注解,懒加载,注入代理对象,只有真正用的时候才会创建Bean,根据Bean是否为多例判断是否要重新创建对象
         *  2. 也是代理对象,使用@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
         *  3. 注入ObjectFactory工厂,每次获取时通过工厂获取,(单例找容器中存在的bean,多实例创建新的Bean)
         *  4. 通过context容器获取bean,通过getBean方法获取的时候,(仅多实例)会重新创建bean
         */


        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(A09Application.class);// 创建容器时候,指定当前类路径，会自动扫描注解的类，并注册到容器中
//        context.registerBean(Config.class);
//        context.registerBean(E.class);

//        context.refresh();

        E bean = context.getBean(E.class);
        System.out.println(bean.getB1());
        System.out.println(bean.getB1());
        System.out.println(bean.getB1());
        System.out.println("-------------------------------------------");
        System.out.println(bean.getB2());
        System.out.println(bean.getB2());
        System.out.println(bean.getB2());
        System.out.println("-------------------------------------------");
        System.out.println(bean.getB3());
        System.out.println(bean.getB3());
        System.out.println(bean.getB3());
        System.out.println("-------------------------------------------");
        System.out.println(bean.getB4());
        System.out.println(bean.getB4());
        System.out.println(bean.getB4());

        context.close();
    }
}
